feat(website): split the site, move docs to /docs, add a landing page - #11243
Merged
Conversation
The Hugo docs site has always been localai.io itself, which left nowhere to explain what LocalAI is or show what the team builds. This adds a separate marketing site at the root and moves the documentation under /docs/. Docs: The existing site keeps its content tree and its Relearn theme, and now builds with baseURL <root>/docs/. Its _index.md, which held a hand written landing page, becomes a real documentation home. Every previously published URL keeps working. GitHub Pages has no server side rewrites, so .github/ci/gen-redirects.sh walks the built docs output and leaves a meta refresh plus a canonical link at each old root path. It covers bare .html files too, which is what keeps /gallery.html alive, and it never overwrites a path the marketing site already owns. Website: A second Hugo site under website/ with its own layouts and no external theme, so the marketing side does not have to fight Relearn's home rooted menu and asset pipeline. CI builds both and merges them into one Pages artifact. The design is derived from the project logo rather than invented: the navy of the triangle, the cyan of the llama, the purple of the speed bars. Those offset bars became the motion signature. The background renders a real depth-anything.cpp depth map as contour lines and switches to a locate-anything.cpp style detection overlay over the engines section. Also included: an /engines/ index driven entirely by data/engines.yaml, a /blog/ section with five posts written from the release notes and the engine benchmark suites, install.sh and a Kubernetes manifest since the site advertises both, and a rule in .agents/ that release preparation now includes a blog post and demo clips. Every figure on the site is derived from the repository or the GitHub API, not from memory. Correcting them against their sources found one error in README.md: voxtral-tts.c is text to speech, not speech to text. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-5 [Bash] [Edit] [Write] [Agent]
…first person The history post read like a changelog written by a committee. It is now in Ettore's voice, first person, with the admissions left in. The numbers paragraph in particular read like a directory listing. It now says what the figures mean rather than which file they came from. Adds an interactive star history chart, built from the GitHub stargazers API rather than embedded from a third party, so the page makes no external request and cannot break when someone else's service is down. The four releases the post is organised around are marked on the curve, and the labels stack into rows because three of them land within two months of each other. The API stops paginating at 40,000 items, so the curve is measured up to December 2025 and the segment from there to today's total is drawn dashed, labelled as an estimate in the caption and in the tooltip. It is a straight line between two known points, and the chart says so rather than implying it is data. Also drops "marketing site" from the README heading and everywhere else it appeared, and calls it the main site instead. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude Code:claude-opus-5 [Bash] [Edit] [Write]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
Splits localai.io into two sites: a marketing site at the root, and the documentation moved under
/docs/.The Hugo docs site has always been localai.io, which left nowhere to explain what LocalAI is or to show what the team builds. This adds that page, and gives the native engines, the APEX quantization work and a blog somewhere to live.
Docs move to
/docs/docs/keeps its content tree and its Relearn theme and now builds withbaseURL <root>/docs/. Its_index.md, which held a hand written marketing landing page, becomes a real documentation home.Every previously published URL keeps working. GitHub Pages has no server side rewrites, so
.github/ci/gen-redirects.shwalks the built docs output and leaves a meta refresh, a canonical link and anoindexat each old root path. 214 redirect stubs are generated. Two details that matter:.htmlfiles, not only directory indexes, which is what keeps/gallery.htmlworking./,/engines/and/blog/survive.docs/static/css/custom.cssis deleted along with the old landing CSS. Relearn auto loadscustom.csson every page and its only content was landing page styling plus a rule hiding the homeh1, which would have hidden the new docs home title.New site under
website/A second Hugo site with its own layouts and no external theme, so the marketing side does not have to fight Relearn's home rooted menu and asset pipeline. CI builds both and merges them into a single Pages artifact.
The design comes from the project logo rather than from nowhere: the navy of the triangle, the cyan of the llama, the purple of the speed bars, the off white of the wordmark. Those offset speed bars became the page's motion signature, used for the scroll progress bar, the nav underlines and every section head. Sora for display, Geist Mono for data, both self hosted.
The background renders a real
depth-anything.cppdepth map as marching squares contour lines, and switches to alocate-anything.cppstyle detection overlay while the engines section holds the viewport, with a scan line wiping between the two. Clicking deforms the depth field with a travelling wave, or runs a detection acquire sequence. Everything collapses to one static frame underprefers-reduced-motion.Page order: hero, what LocalAI is, mission, senses, made with LocalAI, engines, APEX, cluster, models, nib, traction, blog, install.
Also included
/engines/, driven entirely bywebsite/data/engines.yaml, so adding an engine is one YAML edit rather than hand written HTML in two places/blog/with five posts written fromRELEASE_NOTES_v4.8.0.md, the APEX technical report, the parakeet.cpp benchmark suite and the engine READMEswebsite/static/install.sh, a real POSIX installer, since the site advertises it. Asset names were matched against actual releases withgh release view, and it was test run end to endwebsite/static/install/kubernetes.yaml, with probes on the real/readyzand/healthzendpoints fromcore/http/routes/health.go.agents/preparing-a-release.mdthat release preparation now includes a blog post and demo clipsSourcing
Every figure is derived from the repository or the GitHub API, none from memory: 48,042 stars, 4,314 forks, 224 contributors, 133 releases, 73 backend families, 1,585 gallery entries, 18 native engines, 201 APEX builds. The APEX table is the one from the technical report. Engine claims come from each engine's own README and benchmark suite. Community posts are real and linked, spanning 2023 to 2026.
Demo clips are re-encoded from the benchmark suites that run in CI on each engine. Twelve clips plus the presenter video, 2.1 MB of media in total.
Checking those figures against their sources turned up one error in the repo:
README.mddescribedvoxtral-tts.cas speech to text. Its own README says Mistral Voxtral-4B-TTS, 20 preset voices, 24 kHz output. Corrected here, in the same place it appeared on the site.Verification
Built with Hugo 0.146.3 extended, the version CI pins.
/,/engines/,/blog/, all five posts,/docs/,/docs/features/text-generation/all render/features/text-generation/redirects to/docs/features/text-generation//was not overwritten by the redirect generatorinstall.shpassessh -nanddash -n, and a real run installed, verified the checksum, then reported "nothing to do" on a second runkubernetes.yamlparses as five documentsNotes for review
vllm.cppappears in a low key block marked as not yet announced. Merging this announces it regardless of the label. Say the word and it comes out.italian-asrgallery card is a placeholder pending a repo or Hugging Face link.rf-detr.cpphas no clip because the repo was not available locally.kubectl apply --dry-run=clientcould not be run here, no reachable cluster.